# encoding: utf-8
# 项目名称： 常用设计模式
# @File  : 012-代理模式.py
# @Author: sun hao
# @Desc : 
# @Date  :   20:07 2024/11/04


from abc import ABCMeta, abstractmethod


class Subject(metaclass=ABCMeta):
    @abstractmethod
    def get_content(self):
        pass

    def set_content(self, content):
        pass


class RealSubject(Subject):
    def __init__(self, filename):
        # 我这里去打卡一个文件，把里面的内容取读取出来，并写入到content中
        self.filename = filename
        print('读取文件内容')
        with open(self.filename, 'r', encoding='utf-8') as f:
            self.content = f.read()

    def get_content(self):
        # 通过 get_content 就可以知道我读取的内容了

        return self.content

    def set_content(self, content):
        # 根据 新的content，重新打开文件，并写入新content
        with open(self.filename, 'w', encoding='utf-8') as f:
            f.write(content)


# real_subject = RealSubject('012.txt')


# 输出，读取的文件内容
# print(real_subject.get_content())
# # 修改文件内容
# new_content = "这是新的文件内容。\n"
# real_subject.set_content(new_content)
#
# # 再次获取文件内容
# print("修改后的文件内容:")
# print(real_subject.get_content())


# 如果用户读取了这个txt文件，但是什么也不做，如果文件很大，就直接占用了很大的内存空间
print('-----------------------虚代理--------------------------------------')
# 虚代理
class VirtualProxy(Subject):
    def __init__(self, filename):
        self.filename = filename
        self.subj = None

    def get_content(self):
        if not self.subj:
            self.subj = RealSubject(self.filename)
        return self.subj.get_content()

    def set_content(self, content):
        if not self.subj:
            self.subj = RealSubject(self.filename)
        return self.subj.set_content(content)


virtualProxy1 = VirtualProxy('012.txt')
# 我如果下面的print 不执行,你会发现在控制台中看不到  读取文件内容 这个输出；这说明，运行到这里的时候，没有占用内容
print(virtualProxy1.get_content())


# 到这里，才会读取并打印输出 txt文件中的内容，才会占用内存


print('-----------------------保护代理--------------------------------------')
# 保护代理 需要一个只有读，没有写的权限
class ProtectedProxy(Subject):
    def __init__(self, filename):
        self.subj = RealSubject(filename)

    def get_content(self):
        return self.subj.get_content()

    def set_content(self, content):
        raise PermissionError('无写入权限')

# 保护代理，是没有虚代理功能的，它这里其实已经读取好了文件中的内容
ProtectedProxy1 = ProtectedProxy('012.txt')
print(ProtectedProxy1.get_content())
ProtectedProxy1.set_content('1234')